﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SG.UI.Models;
using SG.Domain;
using SG.Logic;
using System.Web.Services;

namespace SG.UI.Controllers
{
    public class ArticuloController : Controller
    {
        private ExpArticulo exp = new ExpArticulo();
        //
        // GET: /Articulo/

        public ActionResult Index()
        {
            TempData["categoriaList"] = exp.GetAllCategoria();
            return View(exp.GetAllArticulo());
        }



        //
        // GET: /Articulo/Create

        public ActionResult CreateEdit(int? id)
        {
            Articulo entity = id.HasValue ? exp.GetArticulo(id.Value) : new Articulo();

            return View(entity);
        }

        public ActionResult ViewPeriod(int id)
        {
            List<Periodo> peridoList = exp.GetAllPeriodoByIdArticulo(id);
            TempData["idArticulo"] = id;
            return View(peridoList);
        }

        public ActionResult ViewArticulosPP()
        {            
            return View(exp.GetAllArticuloDebajoPP());
        }
        public ActionResult ViewSenialRastreo()
        {
            TempData["categoriaList"] = exp.GetAllCategoria();
            return View(exp.GetAllArticulo());
        }
        [HttpPost]
        public ActionResult Predict(int id, FormCollection collection)
        {


            return RedirectToAction("Index");
        }

        //
        // POST: /Articulo/Create

        [HttpPost]
        public ActionResult CreateEdit(int? id, FormCollection collection)
        {
            Articulo entity = new Articulo();
            float fAux;
            int iAux;
            DateTime dtAux;
            double dAux;
            string err = "";
            double promedio=0;
            
            double errorPromedio = 0;
            double MSEn = 0;
            double desviacionEstandar = 0;
            double tendencia = 0;

            DateTime fechaInicial;
            List<double> valoresIndices = new List<double>();
            List<DateTime> fechas=new List<DateTime>();
            try
            {
                entity.Id = id.HasValue ? id.Value : 0;

               
                if (float.TryParse(collection["Alpha"], out fAux)) entity.Alpha = fAux;
                else err += "El campo 'Alpha' debe ser numérico<br/>";

                if (float.TryParse(collection["Beta"], out fAux)) entity.Beta = fAux;
                else err += "El campo 'Beta' debe ser numérico<br/>";
                                
                if (int.TryParse(collection["CantEstaciones"], out iAux)) entity.CantEstaciones = iAux;
                else err += "El campo 'Cantidad de estaciones' debe ser numérico<br/>";
                
                if (float.TryParse(collection["DemandaAnual"], out fAux)) entity.DemandaAnual = fAux;
                else err += "El campo 'Demanda' anual debe ser numérico<br/>";
             
                if (float.TryParse(collection["Gamma"], out fAux)) entity.Gamma = fAux;
                else err += "El campo 'Gamma' debe ser numérico<br/>";

                if (double.TryParse(collection["Promedio"], out dAux)) promedio = dAux;
                else err += "El campo 'Promedio' debe ser numérico<br/>";

                if (float.TryParse(collection["TasaAlmacenamiento"], out fAux)) entity.TasaAlmacenamiento = fAux;
                else err += "El campo 'Tasa almacenamiento' debe ser numérico<br/>";

                if (float.TryParse(collection["UltimoPrecio"], out fAux)) entity.UltimoPrecio = fAux;
                else err += "El campo 'Tasa último precio' debe ser numérico<br/>";

                if (int.TryParse(collection["Stock"], out iAux)) entity.Stock = iAux;
                else err += "El campo 'Stock'  debe ser numérico<br/>";

                //if (float.TryParse(collection["NivelServicio"], out fAux)) entity.NivelServicio = fAux;
                //else err += "El campo NivelServicio debe ser numérico<br/>";


                if (float.TryParse(collection["Tendencia"], out fAux)) tendencia = fAux;
                else err += "El campo Tendencia debe ser numérico<br/>";


                if (float.TryParse(collection["ErrorPromedio"], out fAux)) errorPromedio = fAux;
                else err += "El campo Error promedio debe ser numérico<br/>";


                if (float.TryParse(collection["MSEn"], out fAux)) MSEn = fAux;
                else err += "El campo MSEn debe ser numérico<br/>";

                if (float.TryParse(collection["DesviacionEstandar"], out fAux)) desviacionEstandar = fAux;
                else err += "El campo Desviación estandar debe ser numérico<br/>";


               
                entity.Nombre = collection["Nombre"];
                entity.Descripcion = collection["Descripcion"];
                entity.idSuavizamiento = int.Parse(HttpContext.Request["Suavisamiento"]);
                entity.IdCategoria = int.Parse(HttpContext.Request["IdCategoria"]);
                entity.IdPolitica = int.Parse(HttpContext.Request["IdPolitica"]);
                entity.IdNivelServicio= int.Parse(HttpContext.Request["IdNivelServicio"]);

                if (!id.HasValue)
                    entity.Estado = "NoAsignado";

                switch (entity.idSuavizamiento)
                {
                    case 1:
                        entity.CantDias = 28;
                        exp.IniciarPeriodo(entity, promedio, errorPromedio,MSEn,desviacionEstandar);
                        break;
                    case 2:
                        entity.CantDias = 28;
                        exp.IniciarPeriodo(entity, promedio, tendencia,  errorPromedio, MSEn, desviacionEstandar);
                        break;
                    default:
                          
                           if (DateTime.TryParse(collection["FechaInicioPrimeraEstacion"], out dtAux)) fechaInicial = dtAux;
                            
                           else err += "El campo 'Fecha inicial' debe ser de tipo fecha<br/>";
                           
                           foreach (var item in HttpContext.Request["FechaPeriodo"].Split('|'))
                            {
                                fechas.Add(DateTime.Parse(item));
                            }
                            foreach (var item in HttpContext.Request["ValorPeriodo"].Split('|'))
                            {
                                valoresIndices.Add(double.Parse(item.Replace(".",",")));
                            }
                            entity.CantDias = 365 / valoresIndices.Count;
                            exp.IniciarPeriodo(entity, promedio, valoresIndices, fechas,  errorPromedio, MSEn, desviacionEstandar);
                            break;
                }

               
                if (!String.IsNullOrEmpty(err)) throw new Exception(err);

               exp.SaveOrUpdateArticulo(entity);
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                TempData["VMAlert"] = new VMAlert() { Title = "Error", Body = ex.Message };
                return View(entity);
            }
        }

        [HttpPost]
        public ActionResult Delete(FormCollection collection)
        {
            try
            {
                foreach (string item in collection["IdEntity"].Split(','))
	            {
                    exp.DeleteArticulo(int.Parse(item));                    		 
                }

            }
            catch (Exception ex)
            {
                TempData["VMAlert"] = new VMAlert() { Title = "Err", Body = ex.Message };
            }
             return RedirectToAction("Index");
        }


        [WebMethod]
        
        public JsonResult PredecirPeriodo(int idArticulo,int periodo) {

            double prediccion = exp.PredecirPeriodo(idArticulo,periodo);
            string mensaje="";
            if (prediccion <= 0) mensaje = "El periodo ingresado ya pasó";
            else mensaje = "La demanda esperada para el periodo " + periodo + " es de " + prediccion;

            var result = new { status = 0, err = "", prediccion = mensaje };

            return Json(result, JsonRequestBehavior.AllowGet);
        
        }

        [WebMethod]

        public JsonResult DetallePeriodo(int idPeriodo)
        {

            Error datos = exp.GetDetallesPeriodo(idPeriodo);
            string mensaje;

            float limiteInferior = datos.Periodo.Single(f => f.Id == idPeriodo).Articulo.Categoria.LimiteInferior;
            float limiteSuperior = datos.Periodo.Single(f => f.Id == idPeriodo).Articulo.Categoria.LimiteSuperior;
            if (datos.SenialRastreo >= limiteInferior && datos.SenialRastreo <= limiteSuperior )
                mensaje = "Rango de señal de rastreo aceptable";
            else 
                mensaje = "Rango de señal de rastreo excedido";

            var result = new { status = 0,
                                err = "", 
                                DesviacionEstandar=datos.DesviacionEstandar,
                                ErrorPromedio=datos.ErrorPromedio,
                                MSEn=datos.MSEn,
                                SenialRastreo=datos.SenialRastreo,
                                ValorError=datos.ValorError,
                                mensaje = mensaje
            };

            return Json(result, JsonRequestBehavior.AllowGet);

        }
       
    }

}